/*
 *  Copyright 2014 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.appspot.apprtc;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;

import org.webrtc.Camera2Enumerator;
import org.webrtc.voiceengine.WebRtcAudioUtils;

/**
 * Settings activity for AppRTC.
 */
public class SettingsActivity extends Activity implements OnSharedPreferenceChangeListener {
    private SettingsFragment settingsFragment;
    private String keyprefVideoCall;
    private String keyprefScreencapture;
    private String keyprefCamera2;
    private String keyprefResolution;
    private String keyprefFps;
    private String keyprefCaptureQualitySlider;
    private String keyprefMaxVideoBitrateType;
    private String keyprefMaxVideoBitrateValue;
    private String keyPrefVideoCodec;
    private String keyprefHwCodec;
    private String keyprefCaptureToTexture;
    private String keyprefFlexfec;

    private String keyprefStartAudioBitrateType;
    private String keyprefStartAudioBitrateValue;
    private String keyPrefAudioCodec;
    private String keyprefNoAudioProcessing;
    private String keyprefAecDump;
    private String keyprefOpenSLES;
    private String keyprefDisableBuiltInAEC;
    private String keyprefDisableBuiltInAGC;
    private String keyprefDisableBuiltInNS;
    private String keyprefEnableLevelControl;
    private String keyprefDisableWebRtcAGCAndHPF;
    private String keyprefSpeakerphone;

    private String keyPrefRoomServerUrl;
    private String keyPrefDisplayHud;
    private String keyPrefTracing;

    private String keyprefEnableDataChannel;
    private String keyprefOrdered;
    private String keyprefMaxRetransmitTimeMs;
    private String keyprefMaxRetransmits;
    private String keyprefDataProtocol;
    private String keyprefNegotiated;
    private String keyprefDataId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        keyprefVideoCall = getString(R.string.pref_videocall_key);
        keyprefScreencapture = getString(R.string.pref_screencapture_key);
        keyprefCamera2 = getString(R.string.pref_camera2_key);
        keyprefResolution = getString(R.string.pref_resolution_key);
        keyprefFps = getString(R.string.pref_fps_key);
        keyprefCaptureQualitySlider = getString(R.string.pref_capturequalityslider_key);
        keyprefMaxVideoBitrateType = getString(R.string.pref_maxvideobitrate_key);
        keyprefMaxVideoBitrateValue = getString(R.string.pref_maxvideobitratevalue_key);
        keyPrefVideoCodec = getString(R.string.pref_videocodec_key);
        keyprefHwCodec = getString(R.string.pref_hwcodec_key);
        keyprefCaptureToTexture = getString(R.string.pref_capturetotexture_key);
        keyprefFlexfec = getString(R.string.pref_flexfec_key);

        keyprefStartAudioBitrateType = getString(R.string.pref_startaudiobitrate_key);
        keyprefStartAudioBitrateValue = getString(R.string.pref_startaudiobitratevalue_key);
        keyPrefAudioCodec = getString(R.string.pref_audiocodec_key);
        keyprefNoAudioProcessing = getString(R.string.pref_noaudioprocessing_key);
        keyprefAecDump = getString(R.string.pref_aecdump_key);
        keyprefOpenSLES = getString(R.string.pref_opensles_key);
        keyprefDisableBuiltInAEC = getString(R.string.pref_disable_built_in_aec_key);
        keyprefDisableBuiltInAGC = getString(R.string.pref_disable_built_in_agc_key);
        keyprefDisableBuiltInNS = getString(R.string.pref_disable_built_in_ns_key);
        keyprefEnableLevelControl = getString(R.string.pref_enable_level_control_key);
        keyprefDisableWebRtcAGCAndHPF = getString(R.string.pref_disable_webrtc_agc_and_hpf_key);
        keyprefSpeakerphone = getString(R.string.pref_speakerphone_key);

        keyprefEnableDataChannel = getString(R.string.pref_enable_datachannel_key);
        keyprefOrdered = getString(R.string.pref_ordered_key);
        keyprefMaxRetransmitTimeMs = getString(R.string.pref_max_retransmit_time_ms_key);
        keyprefMaxRetransmits = getString(R.string.pref_max_retransmits_key);
        keyprefDataProtocol = getString(R.string.pref_data_protocol_key);
        keyprefNegotiated = getString(R.string.pref_negotiated_key);
        keyprefDataId = getString(R.string.pref_data_id_key);

        keyPrefRoomServerUrl = getString(R.string.pref_room_server_url_key);
        keyPrefDisplayHud = getString(R.string.pref_displayhud_key);
        keyPrefTracing = getString(R.string.pref_tracing_key);

        // Display the fragment as the main content.
        settingsFragment = new SettingsFragment();
        getFragmentManager()
                .beginTransaction()
                .replace(android.R.id.content, settingsFragment)
                .commit();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Set summary to be the user-description for the selected value
        SharedPreferences sharedPreferences =
                settingsFragment.getPreferenceScreen().getSharedPreferences();
        sharedPreferences.registerOnSharedPreferenceChangeListener(this);
        updateSummaryB(sharedPreferences, keyprefVideoCall);
        updateSummaryB(sharedPreferences, keyprefScreencapture);
        updateSummaryB(sharedPreferences, keyprefCamera2);
        updateSummary(sharedPreferences, keyprefResolution);
        updateSummary(sharedPreferences, keyprefFps);
        updateSummaryB(sharedPreferences, keyprefCaptureQualitySlider);
        updateSummary(sharedPreferences, keyprefMaxVideoBitrateType);
        updateSummaryBitrate(sharedPreferences, keyprefMaxVideoBitrateValue);
        setVideoBitrateEnable(sharedPreferences);
        updateSummary(sharedPreferences, keyPrefVideoCodec);
        updateSummaryB(sharedPreferences, keyprefHwCodec);
        updateSummaryB(sharedPreferences, keyprefCaptureToTexture);
        updateSummaryB(sharedPreferences, keyprefFlexfec);

        updateSummary(sharedPreferences, keyprefStartAudioBitrateType);
        updateSummaryBitrate(sharedPreferences, keyprefStartAudioBitrateValue);
        setAudioBitrateEnable(sharedPreferences);
        updateSummary(sharedPreferences, keyPrefAudioCodec);
        updateSummaryB(sharedPreferences, keyprefNoAudioProcessing);
        updateSummaryB(sharedPreferences, keyprefAecDump);
        updateSummaryB(sharedPreferences, keyprefOpenSLES);
        updateSummaryB(sharedPreferences, keyprefDisableBuiltInAEC);
        updateSummaryB(sharedPreferences, keyprefDisableBuiltInAGC);
        updateSummaryB(sharedPreferences, keyprefDisableBuiltInNS);
        updateSummaryB(sharedPreferences, keyprefEnableLevelControl);
        updateSummaryB(sharedPreferences, keyprefDisableWebRtcAGCAndHPF);
        updateSummaryList(sharedPreferences, keyprefSpeakerphone);

        updateSummaryB(sharedPreferences, keyprefEnableDataChannel);
        updateSummaryB(sharedPreferences, keyprefOrdered);
        updateSummary(sharedPreferences, keyprefMaxRetransmitTimeMs);
        updateSummary(sharedPreferences, keyprefMaxRetransmits);
        updateSummary(sharedPreferences, keyprefDataProtocol);
        updateSummaryB(sharedPreferences, keyprefNegotiated);
        updateSummary(sharedPreferences, keyprefDataId);
        setDataChannelEnable(sharedPreferences);

        updateSummary(sharedPreferences, keyPrefRoomServerUrl);
        updateSummaryB(sharedPreferences, keyPrefDisplayHud);
        updateSummaryB(sharedPreferences, keyPrefTracing);

        if (!Camera2Enumerator.isSupported(this)) {
            Preference camera2Preference = settingsFragment.findPreference(keyprefCamera2);

            camera2Preference.setSummary(getString(R.string.pref_camera2_not_supported));
            camera2Preference.setEnabled(false);
        }

        // Disable forcing WebRTC based AEC so it won't affect our value.
        // Otherwise, if it was enabled, isAcousticEchoCancelerSupported would always return false.
        WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(false);
        if (!WebRtcAudioUtils.isAcousticEchoCancelerSupported()) {
            Preference disableBuiltInAECPreference =
                    settingsFragment.findPreference(keyprefDisableBuiltInAEC);

            disableBuiltInAECPreference.setSummary(getString(R.string.pref_built_in_aec_not_available));
            disableBuiltInAECPreference.setEnabled(false);
        }

        WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(false);
        if (!WebRtcAudioUtils.isAutomaticGainControlSupported()) {
            Preference disableBuiltInAGCPreference =
                    settingsFragment.findPreference(keyprefDisableBuiltInAGC);

            disableBuiltInAGCPreference.setSummary(getString(R.string.pref_built_in_agc_not_available));
            disableBuiltInAGCPreference.setEnabled(false);
        }

        WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(false);
        if (!WebRtcAudioUtils.isNoiseSuppressorSupported()) {
            Preference disableBuiltInNSPreference =
                    settingsFragment.findPreference(keyprefDisableBuiltInNS);

            disableBuiltInNSPreference.setSummary(getString(R.string.pref_built_in_ns_not_available));
            disableBuiltInNSPreference.setEnabled(false);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        SharedPreferences sharedPreferences =
                settingsFragment.getPreferenceScreen().getSharedPreferences();
        sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // clang-format off
        if (key.equals(keyprefResolution)
                || key.equals(keyprefFps)
                || key.equals(keyprefMaxVideoBitrateType)
                || key.equals(keyPrefVideoCodec)
                || key.equals(keyprefStartAudioBitrateType)
                || key.equals(keyPrefAudioCodec)
                || key.equals(keyPrefRoomServerUrl)
                || key.equals(keyprefMaxRetransmitTimeMs)
                || key.equals(keyprefMaxRetransmits)
                || key.equals(keyprefDataProtocol)
                || key.equals(keyprefDataId)) {
            updateSummary(sharedPreferences, key);
        } else if (key.equals(keyprefMaxVideoBitrateValue)
                || key.equals(keyprefStartAudioBitrateValue)) {
            updateSummaryBitrate(sharedPreferences, key);
        } else if (key.equals(keyprefVideoCall)
                || key.equals(keyprefScreencapture)
                || key.equals(keyprefCamera2)
                || key.equals(keyPrefTracing)
                || key.equals(keyprefCaptureQualitySlider)
                || key.equals(keyprefHwCodec)
                || key.equals(keyprefCaptureToTexture)
                || key.equals(keyprefFlexfec)
                || key.equals(keyprefNoAudioProcessing)
                || key.equals(keyprefAecDump)
                || key.equals(keyprefOpenSLES)
                || key.equals(keyprefDisableBuiltInAEC)
                || key.equals(keyprefDisableBuiltInAGC)
                || key.equals(keyprefDisableBuiltInNS)
                || key.equals(keyprefEnableLevelControl)
                || key.equals(keyprefDisableWebRtcAGCAndHPF)
                || key.equals(keyPrefDisplayHud)
                || key.equals(keyprefEnableDataChannel)
                || key.equals(keyprefOrdered)
                || key.equals(keyprefNegotiated)) {
            updateSummaryB(sharedPreferences, key);
        } else if (key.equals(keyprefSpeakerphone)) {
            updateSummaryList(sharedPreferences, key);
        }
        // clang-format on
        if (key.equals(keyprefMaxVideoBitrateType)) {
            setVideoBitrateEnable(sharedPreferences);
        }
        if (key.equals(keyprefStartAudioBitrateType)) {
            setAudioBitrateEnable(sharedPreferences);
        }
        if (key.equals(keyprefEnableDataChannel)) {
            setDataChannelEnable(sharedPreferences);
        }
    }

    private void updateSummary(SharedPreferences sharedPreferences, String key) {
        Preference updatedPref = settingsFragment.findPreference(key);
        // Set summary to be the user-description for the selected value
        updatedPref.setSummary(sharedPreferences.getString(key, ""));
    }

    private void updateSummaryBitrate(SharedPreferences sharedPreferences, String key) {
        Preference updatedPref = settingsFragment.findPreference(key);
        updatedPref.setSummary(sharedPreferences.getString(key, "") + " kbps");
    }

    private void updateSummaryB(SharedPreferences sharedPreferences, String key) {
        Preference updatedPref = settingsFragment.findPreference(key);
        updatedPref.setSummary(sharedPreferences.getBoolean(key, true)
                ? getString(R.string.pref_value_enabled)
                : getString(R.string.pref_value_disabled));
    }

    private void updateSummaryList(SharedPreferences sharedPreferences, String key) {
        ListPreference updatedPref = (ListPreference) settingsFragment.findPreference(key);
        updatedPref.setSummary(updatedPref.getEntry());
    }

    private void setVideoBitrateEnable(SharedPreferences sharedPreferences) {
        Preference bitratePreferenceValue =
                settingsFragment.findPreference(keyprefMaxVideoBitrateValue);
        String bitrateTypeDefault = getString(R.string.pref_maxvideobitrate_default);
        String bitrateType =
                sharedPreferences.getString(keyprefMaxVideoBitrateType, bitrateTypeDefault);
        if (bitrateType.equals(bitrateTypeDefault)) {
            bitratePreferenceValue.setEnabled(false);
        } else {
            bitratePreferenceValue.setEnabled(true);
        }
    }

    private void setAudioBitrateEnable(SharedPreferences sharedPreferences) {
        Preference bitratePreferenceValue =
                settingsFragment.findPreference(keyprefStartAudioBitrateValue);
        String bitrateTypeDefault = getString(R.string.pref_startaudiobitrate_default);
        String bitrateType =
                sharedPreferences.getString(keyprefStartAudioBitrateType, bitrateTypeDefault);
        if (bitrateType.equals(bitrateTypeDefault)) {
            bitratePreferenceValue.setEnabled(false);
        } else {
            bitratePreferenceValue.setEnabled(true);
        }
    }

    private void setDataChannelEnable(SharedPreferences sharedPreferences) {
        boolean enabled = sharedPreferences.getBoolean(keyprefEnableDataChannel, true);
        settingsFragment.findPreference(keyprefOrdered).setEnabled(enabled);
        settingsFragment.findPreference(keyprefMaxRetransmitTimeMs).setEnabled(enabled);
        settingsFragment.findPreference(keyprefMaxRetransmits).setEnabled(enabled);
        settingsFragment.findPreference(keyprefDataProtocol).setEnabled(enabled);
        settingsFragment.findPreference(keyprefNegotiated).setEnabled(enabled);
        settingsFragment.findPreference(keyprefDataId).setEnabled(enabled);
    }
}
